文字クラス

文字クラスは、文字や数字の区別など、文字の種類を区別します。

試してみましょう

種類

文字 意味
[xyz]
[a-c]

文字クラス: 囲んだ文字のいずれかに一致します。ハイフンを使用して文字の範囲を指定することもできますが、ハイフンが角括弧で囲まれた最初または最後の文字として現れた場合、それは通常の文字として文字クラスに含めるためのリテラルハイフンと見なされます。

例えば、 [abcd][a-d] と同じです。 "brisket" の "b" や "chop" の "c" に一致します。

例えば、 [abcd-][-abcd] は "brisket" の "b"、 "chop" の "c"、そして "non-profit" の "-" (ハイフン)に一致します。

例えば、 [\w-][A-Za-z0-9_-] と同じです。どちらも "brisket" の "b"、 "chop" の "c"、 "non-profit" の "n" に一致します。

unicodeSets フラグ (v) が有効な場合、文字クラスにはいくつかの機能が追加されます。詳しくは文字クラス参照を参照してください。

[^xyz]
[^a-c]

否定文字クラス: 角括弧で囲まれているものではないもの全てに一致します。ハイフンを使用して文字の範囲を指定することができますが、ハイフンが ^ の後の最初の文字、または角括弧で囲まれた最後の文字として現れた場合、それは通常の文字として文字クラスに含めるためにリテラルハイフンと解釈されます。 例えば、[^abc][^a-c] と同じです。これらは、最初は "bacon" の "o" や "chop" の "h" に一致します。

メモ: ^ の文字は入力の先頭も意味することがあります。

.

ワイルドカード: 改行文字 (\n\r\u2028\u2029) を除くあらゆる 1 文字と一致します。 例えば、/.y/ は "my" と "ay" に一致ますが、"yes make my day" の "yes" には一致しません。 dotAll フラグ (s) が有効な場合は、改行文字にも一致します。 文字クラス内では . はその特別な意味を失い、文字通りの "." と一致します。

\d

数字文字クラスエスケープ: あらゆる(アラビア)数字に一致します。[0-9] に相当します。例えば /\d//[0-9]/ は "B2 is the suite number" の "2" に一致します。

\D

非数字文字クラスエスケープ: あらゆる(アラビア)数字以外の文字に一致します。[^0-9] に相当します。例えば /\D//[^0-9]/ は "B2 is the suite number" の "B" に一致します。

\w

英数文字クラスエスケープ: アンダースコアを含むあらゆる半角英数字(基本ラテンアルファベット)に一致します。 [A-Za-z0-9_] に相当します。例えば /\w/ は、"apple" の "a"、"$5.28" の "5"、"3D" の "3"、"Émanuel" の "e" に一致します。

\W

非英数文字クラスエスケープ: 基本ラテンアルファベットの文字以外に一致します。 [^A-Za-z0-9_] と同等です。例えば /\W//[^A-Za-z0-9_]/ は、"50%" の "%" や "Émanuel" の "É" に一致します。

\s

ホワイトスペース文字クラスエスケープ: ホワイトスペース文字、例えば空白、タブ、改ページ、改行、その他の Unicode 空白文字などの 1 文字に一致します。 [\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff] に相当します。例えば /\s\w*/ は "foo bar" の "bar" に一致します。

\S

非ホワイトスペース文字クラスエスケープ: ホワイトスペース以外の 1 文字に一致します。 [^\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff] に相当します。 例えば /\S\w*/ は "foo bar" の "foo" に一致します。

\t 水平タブに一致します。
\r 復帰文字に一致します。
\n 行送り文字に一致します。
\v 垂直タブに一致します。
\f 改ページに一致します。
[\b] 後退文字に一致します。単語境界アサーション (\b) についてはアサーションを参照してください。
\0 NUL 文字に一致します。この後ろに他の数字を続けてはいけません。
\cX

キャレット記法を使用した制御文字に一致します。 "X" には A–Z の文字が入ります(コードポイントU+0001U+001A に対応します)。例えば /\cM\J/ は "\r\n" に一致します。

\xhh hh (2 桁の 16 進数)コードからなる文字に一致します。
\uhhhh hhhh (4 桁の 16 進数)の値からなる UTF-16 コードユニットに一致します。
\u{hhhh} または \u{hhhhh} u フラグがセットされた時のみ) U+hhhh または U+hhhhh (16 進数) Unicode 値からなる文字に一致します。
\p{UnicodeProperty}, \P{UnicodeProperty}

Unicode 文字クラスエスケープ: Unicode 文字プロパティに基づいた文字に一致します。例えば、絵文字、日本語のカタカナ、中国語や日本語の漢字などです。

\

次の文字を特別に扱うこと、「エスケープ」することを示します。 その振る舞いは、2 通りのうちのどちらか 1 つです。

  • 通常文字の前に付けられた場合、次の文字が特別なもので、文字通りには評価されないことを示します。 例えば、 /b/ は文字 "b" に一致します。しかし "b" の前にバックスラッシュを置いて /\b/ とすると、単語区切りを意味するようになります。
  • 特殊文字の前に付けられた場合、次の文字が特別なものでなく、文字通りに評価されることを表します。例えば、 "*" は、直前の文字が 0 個以上の出現した場合に一致することを意味する特殊文字です。例えば、 /a*/ は 0 個以上の "a" と一致します。 * と文字通りに照合するには、その直前にバックスラッシュを入れます。例えば、/a\*/ は "a*" と一致します。

メモ: この文字を文字通りに一致させるには、それ自身をエスケープしてください。つまり、 \ を検索するには /\\/ を使ってください。

x|y

論理和: "x" または "y" に一致します。パイプ (|) で区切られた各成分は、代替 (alternative)と呼ばれます。 例えば、/green|red/ は "green apple" の "green" と "red apple" の "red" に一致します。

メモ: 論理和は「選択肢の集合」を指定するもう一つの方法ですが、文字クラスではありません。論理和は独立したものではありません。大きなパターンの一部にするためにはグループを使用する必要があります。[abc] は機能的には (?:a|b|c) と等価です。

一連の数字を探す

この例では、4 桁の数字列を \d{4} で照合します。\b単語境界を示します(つまり、数列の途中から照合を始めたり終了したりしない)。

js
const randomData = "015 354 8787 687351 3512 8735";
const regexpFourDigits = /\b\d{4}\b/g;

console.table(randomData.match(regexpFourDigits));
// ['8787', '3512', '8735']

それ以外の例は文字クラスエスケープリファレンスを参照してください。

A から始まる(ラテンアルファベットの)単語を探す

この例では、A で始まる単語を照合します。\b単語境界(単語の途中から照合を始めない)を示します。[aA] は文字 "a" または "A" を示します。\w+ はラテンアルファベットの任意の文字を複数回示します(+数量子です)。なお、すでに単語の文字がなくなるまで照合するので、末尾の \b 境界は必要ありません。

js
const aliceExcerpt =
  "I'm sure I'm not Ada,' she said, 'for her hair goes in such long ringlets, and mine doesn't go in ringlets at all.";
const regexpWordStartingWithA = /\b[aA]\w+/g;

console.table(aliceExcerpt.match(regexpWordStartingWithA));
// ['Ada', 'and', 'at', 'all']

それ以外の例は文字クラスエスケープリファレンスを参照してください。

(Unicode 文字の)単語を探す

単語を表すために、ラテンアルファベットではなく、 Unicode 文字の範囲を使用することができます。(つまり、ロシア語やアラビア語のような他の言語のテキストを扱うことができます。) Unicode の 「基本多言語面」には、世界中で使われているほとんどの文字が含まれており、それらの文字で書かれた単語にマッチするための文字クラスと範囲を利用できます。

js
const nonEnglishText = "Приключения Алисы в Стране чудес";
const regexpBMPWord = /([\u0000-\u0019\u0021-\uFFFF])+/gu;
// U+0000 から U+FFFF までの BMP、ただし、U+0020 は空白

console.table(nonEnglishText.match(regexpBMPWord));
["Приключения", "Алисы", "в", "Стране", "чудес"];

それ以外の例は Unicode 文字クラスエスケープリファレンスを参照してください。

母音を数える

この例では、母音 (A, E, I, O, U, Y) で始まる単語を数えます。 g フラグは、テキスト中に出現するすべてのパターンに使用します。 i フラグはパターンを大文字と小文字を区別しないようにするために使用し、大文字の母音と小文字の母音の両方に一致します。

js
const aliceExcerpt =
  "There was a long silence after this, and Alice could only hear whispers now and then.";
const regexpVowels = /[aeiouy]/gi;

console.log("母音の数:", aliceExcerpt.match(regexpVowels).length);
// 母音の数: 26

関連情報